WebCodecs์ ๋ณต์กํ VideoFrame ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ํ์ํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ ๋ก ์๋ ์ ์ด ๋ฅ๋ ฅ์ผ๋ก ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋น๋์ค ์คํธ๋ฆผ์ ์กฐ์ํ๊ณ ๋ถ์ํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
WebCodecs์ ์ ์ฌ๋ ฅ ์ ๊ธ ํด์ : VideoFrame ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ ์ฌ์ธต ๋ถ์
WebCodecs API์ ๋ฑ์ฅ์ ์น ๊ฐ๋ฐ์๋ค์ด ๋ฉํฐ๋ฏธ๋์ด๋ฅผ ๋ฎ์ ์์ค์์ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ํ์ ํ์ต๋๋ค. ๊ทธ ํต์ฌ์๋ ๋น๋์ค ๋ฐ์ดํฐ์ ๋จ์ผ ํ๋ ์์ ๋ํ๋ด๋ ๊ฐ๋ ฅํ ๊ฐ์ฒด์ธ VideoFrame์ด ์์ต๋๋ค. VideoFrame ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ดํดํ๋ ๊ฒ์ ์ค์๊ฐ ๋น๋์ค ๋ถ์ ๋ฐ ์กฐ์๋ถํฐ ๋ง์ถคํ ์คํธ๋ฆฌ๋ฐ ์๋ฃจ์ ์ ์ด๋ฅด๊ธฐ๊น์ง, ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๊ณ ๊ธ ๋น๋์ค ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ ๋ชจ๋ ์ด์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ๋์ฝ๋ฉ๋ถํฐ ์ ์ฌ์ ์ธ ์ฌ์ธ์ฝ๋ฉ๊น์ง VideoFrame์ ์ ์ฒด ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋ดํ๊ณ , ์ด๊ฒ์ด ๊ธ๋ก๋ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ด์ฃผ๋ ๋ฌด์ํ ๊ฐ๋ฅ์ฑ์ ํ์ํ ๊ฒ์ ๋๋ค.
๊ธฐ์ด: VideoFrame์ด๋ ๋ฌด์์ธ๊ฐ?
ํ์ดํ๋ผ์ธ์ ์์ธํ ์ดํด๋ณด๊ธฐ ์ ์, VideoFrame์ด ๋ฌด์์ธ์ง ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ํ ์์ ์ด๋ฏธ์ง๊ฐ ์๋๋ผ, ์ค์ํ ๋ฉํ๋ฐ์ดํฐ์ ํจ๊ป ๋์ฝ๋ฉ๋ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๊ตฌ์กฐํ๋ ๊ฐ์ฒด์ ๋๋ค. ์ด ๋ฉํ๋ฐ์ดํฐ์๋ ํ์์คํฌํ, ํ์(์: YUV, RGBA), ๊ฐ์ ์์ญ, ์ ๊ณต๊ฐ ๋ฑ๊ณผ ๊ฐ์ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ํ๋ถํ ์ปจํ ์คํธ๋ ๊ฐ๋ณ ๋น๋์ค ํ๋ ์์ ๋ํ ์ ๋ฐํ ์ ์ด์ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ ํต์ ์ผ๋ก ์น ๊ฐ๋ฐ์๋ค์ ๋น๋์ค ํ๋ ์์ ๊ทธ๋ฆฌ๊ธฐ ์ํด Canvas๋ WebGL๊ณผ ๊ฐ์ ๊ณ ์์ค API์ ์์กดํ์ต๋๋ค. ์ด๊ฒ๋ค์ ๋ ๋๋ง์๋ ํ๋ฅญํ์ง๋ง, ์ข ์ข ๊ธฐ๋ณธ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์ถ์ํํ์ฌ ์ ์์ค ์ฒ๋ฆฌ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. WebCodecs๋ ์ด๋ฌํ ์ ์์ค ์ ๊ทผ์ ๋ธ๋ผ์ฐ์ ๋ก ๊ฐ์ ธ์, ์ด์ ์๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ๊ฐ๋ฅํ๋ ์ ๊ตํ ์์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
WebCodecs VideoFrame ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ: ๋จ๊ณ๋ณ ์ฌ์
WebCodecs๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋์ค ํ๋ ์์ ์ฒ๋ฆฌํ๋ ์ผ๋ฐ์ ์ธ ํ์ดํ๋ผ์ธ์ ๋ช ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค. ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ๋์ฝ๋ฉ: ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ์์ ๋์ฝ๋ฉ ๊ฐ๋ฅํ ํ๋ ์์ผ๋ก
VideoFrame์ ์ฌ์ ์ ๋ณดํต ์ธ์ฝ๋ฉ๋ ๋น๋์ค ๋ฐ์ดํฐ์์ ์์๋ฉ๋๋ค. ์ด๋ ์น์บ , ๋น๋์ค ํ์ผ ๋๋ ๋คํธ์ํฌ ๊ธฐ๋ฐ ๋ฏธ๋์ด์ ์คํธ๋ฆผ์ผ ์ ์์ต๋๋ค. VideoDecoder๋ ์ด ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋์ฝ๋ฉ ๊ฐ๋ฅํ ํ์์ผ๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก VideoFrame์ผ๋ก ํํ๋ฉ๋๋ค.
์ฃผ์ ๊ตฌ์ฑ ์์:
- ์ธ์ฝ๋ฉ๋ ๋น๋์ค ์ฒญํฌ(Encoded Video Chunk): ๋์ฝ๋์ ์ ๋ ฅ์ ๋๋ค. ์ด ์ฒญํฌ๋ ์ธ์ฝ๋ฉ๋ ๋น๋์ค ๋ฐ์ดํฐ์ ์์ ์ธ๊ทธ๋จผํธ๋ฅผ ํฌํจํ๋ฉฐ, ์ข ์ข ๋จ์ผ ํ๋ ์ ๋๋ ํ๋ ์ ๊ทธ๋ฃน(์: I-ํ๋ ์, P-ํ๋ ์, B-ํ๋ ์)์ ๋๋ค.
- VideoDecoderConfig: ์ด ๊ตฌ์ฑ ๊ฐ์ฒด๋ ์ฝ๋ฑ(์: H.264, VP9, AV1), ํ๋กํ, ๋ ๋ฒจ, ํด์๋, ์ ๊ณต๊ฐ๊ณผ ๊ฐ์ด ๋ค์ด์ค๋ ๋น๋์ค ์คํธ๋ฆผ์ ๋ํด ๋์ฝ๋๊ฐ ์์์ผ ํ ๋ชจ๋ ๊ฒ์ ์๋ ค์ค๋๋ค.
- VideoDecoder:
VideoDecoderAPI์ ์ธ์คํด์ค์ ๋๋ค. ๋น์ ์VideoDecoderConfig๋ก ๊ตฌ์ฑํ๊ณEncodedVideoChunk๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. - ํ๋ ์ ์ถ๋ ฅ ์ฝ๋ฐฑ(Frame Output Callback):
VideoDecoder์๋ VideoFrame์ด ์ฑ๊ณต์ ์ผ๋ก ๋์ฝ๋ฉ๋ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ์ด ์์ต๋๋ค. ์ด ์ฝ๋ฐฑ์ ๋์ฝ๋ฉ๋VideoFrame๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค๋นํฉ๋๋ค.
์์ ์๋๋ฆฌ์ค: ์ฌ๋ฌ ๋๋ฅ์ ๊ฑธ์ณ ๋ฐฐํฌ๋ ์๊ฒฉ ์ผ์ ๋ฐฐ์ด์์ ์ค์๊ฐ H.264 ์คํธ๋ฆผ์ ์์ ํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๋ธ๋ผ์ฐ์ ๋ H.264์ฉ์ผ๋ก ๊ตฌ์ฑ๋ VideoDecoder๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ธ์ฝ๋ฉ๋ ์ฒญํฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์์ ํ ํ๋ ์์ด ๋์ฝ๋ฉ๋ ๋๋ง๋ค ์ถ๋ ฅ ์ฝ๋ฐฑ์ VideoFrame ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ ํ์ดํ๋ผ์ธ์ ๋ค์ ๋จ๊ณ๋ก ์ ๋ฌ๋ ์ ์์ต๋๋ค.
2. ์ฒ๋ฆฌ ๋ฐ ์กฐ์: ํ์ดํ๋ผ์ธ์ ํต์ฌ
VideoFrame ๊ฐ์ฒด๋ฅผ ์ป๊ฒ ๋๋ฉด WebCodecs์ ์ง์ ํ ํ์ด ๋ฐํ๋ฉ๋๋ค. ์ด ๋จ๊ณ๋ ํ๋ ์ ๋ฐ์ดํฐ์ ๋ํด ๋ค์ํ ์์
์ ์ํํ ์ ์๋ ๊ณณ์
๋๋ค. ์ด๋ ๋งค์ฐ ์ฌ์ฉ์ ์ ์๊ฐ ๊ฐ๋ฅํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์ผ๋ฐ์ ์ธ ์ฒ๋ฆฌ ์์ :
- ์ ๊ณต๊ฐ ๋ณํ: ๋ค๋ฅธ API์์ ํธํ์ฑ ๋๋ ๋ถ์์ ์ํด ์ฌ๋ฌ ์ ๊ณต๊ฐ(์: YUV์์ RGBA๋ก) ๊ฐ์ ๋ณํํฉ๋๋ค.
- ํ๋ ์ ์๋ฅด๊ธฐ ๋ฐ ํฌ๊ธฐ ์กฐ์ : ํ๋ ์์ ํน์ ์์ญ์ ์ถ์ถํ๊ฑฐ๋ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค.
- ํํฐ ์ ์ฉ: ๊ทธ๋ ์ด์ค์ผ์ผ, ๋ธ๋ฌ, ์ฃ์ง ๊ฐ์ง ๋๋ ๋ง์ถคํ ์๊ฐ ํจ๊ณผ์ ๊ฐ์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ํํฐ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋
VideoFrame์ Canvas์ ๊ทธ๋ฆฌ๊ฑฐ๋ WebGL์ ์ฌ์ฉํ ๋ค์, ์ ์ฌ์ ์ผ๋ก ์๋ก์ดVideoFrame์ผ๋ก ๋ค์ ์บก์ฒํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค. - ์ ๋ณด ์ค๋ฒ๋ ์ด: ๋น๋์ค ํ๋ ์์ ํ ์คํธ, ๊ทธ๋ํฝ ๋๋ ๊ธฐํ ์ค๋ฒ๋ ์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ ์ข ์ข Canvas๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
- ์ปดํจํฐ ๋น์ ์์
: ๊ฐ์ฒด ๊ฐ์ง, ์ผ๊ตด ์ธ์, ๋ชจ์
์ถ์ ๋๋ ์ฆ๊ฐ ํ์ค ์ค๋ฒ๋ ์ด๋ฅผ ์ํํฉ๋๋ค. TensorFlow.js๋ OpenCV.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ๊ธฐ์ ํตํฉํ ์ ์์ผ๋ฉฐ, ์ข
์ข
VideoFrame์ ์ฒ๋ฆฌ๋ฅผ ์ํด Canvas์ ๋ ๋๋งํฉ๋๋ค. - ํ๋ ์ ๋ถ์: ํ๊ท ๋ฐ๊ธฐ ๊ณ์ฐ, ํ๋ ์ ๊ฐ ๋ชจ์ ๊ฐ์ง ๋๋ ํต๊ณ ๋ถ์ ์ํ๊ณผ ๊ฐ์ ๋ถ์ ๋ชฉ์ ์ผ๋ก ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
๊ธฐ์ ์ ์๋ ๋ฐฉ์:
VideoFrame ์์ฒด๋ (์ฑ๋ฅ ๋ฐ ๋ณด์์์ ์ด์ ๋ก) ์ง์ ์กฐ์ ๊ฐ๋ฅํ ํ์์ผ๋ก ์์ ํฝ์
๋ฐ์ดํฐ๋ฅผ ๋
ธ์ถํ์ง ์์ง๋ง, HTML Canvas ์์์ ํจ์จ์ ์ผ๋ก ๊ทธ๋ฆด ์ ์์ต๋๋ค. Canvas์ ๊ทธ๋ ค์ง๋ฉด canvas.getContext('2d').getImageData()๋ฅผ ์ฌ์ฉํ์ฌ ํฝ์
๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฑฐ๋, ๋ ์ฑ๋ฅ ์ง์ฝ์ ์ธ ๊ทธ๋ํฝ ์์
์ ์ํด WebGL์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Canvas์์ ์ฒ๋ฆฌ๋ ํ๋ ์์ ์ดํ ์ธ์ฝ๋ฉ์ด๋ ์ ์ก์ ์ํด ํ์ํ ๊ฒฝ์ฐ ์๋ก์ด VideoFrame ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์์ ์๋๋ฆฌ์ค: ์ฐธ๊ฐ์๋ค์ด ์์ ์ ๋น๋์ค ํผ๋๋ฅผ ๊ณต์ ํ๋ ๊ธ๋ก๋ฒ ํ์
ํ๋ซํผ์ ์๊ฐํด ๋ณด์ญ์์ค. ๊ฐ ํผ๋๋ ์ค์๊ฐ ์คํ์ผ ์ ์ก ํํฐ๋ฅผ ์ ์ฉํ์ฌ ์ฐธ๊ฐ์ ๋น๋์ค๊ฐ ๊ณ ์ ํํ์ฒ๋ผ ๋ณด์ด๋๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ๊ฐ ํผ๋์ VideoFrame์ Canvas์ ๊ทธ๋ ค์ง๊ณ , WebGL์ ์ฌ์ฉํ์ฌ ํํฐ๊ฐ ์ ์ฉ๋ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์ ์ธ์ฝ๋ฉ๋๊ฑฐ๋ ์ง์ ํ์๋ ์ ์์ต๋๋ค.
3. ์ธ์ฝ๋ฉ (์ ํ ์ฌํญ): ์ ์ก ๋๋ ์ ์ฅ์ ์ํ ์ค๋น
๋ง์ ์๋๋ฆฌ์ค์์ ์ฒ๋ฆฌ ํ์๋ ์ ์ฅ, ๋คํธ์ํฌ๋ฅผ ํตํ ์ ์ก ๋๋ ํน์ ํ๋ ์ด์ด์์ ํธํ์ฑ์ ์ํด ๋น๋์ค ํ๋ ์์ ๋ค์ ์ธ์ฝ๋ฉํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด VideoEncoder๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฃผ์ ๊ตฌ์ฑ ์์:
- VideoFrame: ์ธ์ฝ๋์ ์
๋ ฅ์
๋๋ค. ์ด๊ฒ์ ์ฒ๋ฆฌ๋
VideoFrame๊ฐ์ฒด์ ๋๋ค. - VideoEncoderConfig: ๋์ฝ๋ ๊ตฌ์ฑ๊ณผ ์ ์ฌํ๊ฒ, ์ํ๋ ์ถ๋ ฅ ํ์, ์ฝ๋ฑ, ๋นํธ๋ ์ดํธ, ํ๋ ์ ์๋ ๋ฐ ๊ธฐํ ์ธ์ฝ๋ฉ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค.
- VideoEncoder:
VideoEncoderAPI์ ์ธ์คํด์ค์ ๋๋ค.VideoFrame๊ณผVideoEncoderConfig๋ฅผ ๋ฐ์EncodedVideoChunk๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. - ์ธ์ฝ๋ฉ๋ ์ฒญํฌ ์ถ๋ ฅ ์ฝ๋ฐฑ(Encoded Chunk Output Callback): ์ธ์ฝ๋์๋ ๊ฒฐ๊ณผ๋ฌผ์ธ
EncodedVideoChunk๋ฅผ ์์ ํ๋ ์ฝ๋ฐฑ์ด ์์ผ๋ฉฐ, ์ด๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๊ฑฐ๋ ์ ์ฅ๋ ์ ์์ต๋๋ค.
์์ ์๋๋ฆฌ์ค: ๊ตญ์ ์ฐ๊ตฌํ์ด ์๊ฒฉ ์ง์ญ์ ํ๊ฒฝ ์ผ์์์ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์์ต๋๋ค. ์ ๋ช
๋๋ฅผ ๋์ด๊ธฐ ์ํด ๊ฐ ํ๋ ์์ ์ด๋ฏธ์ง ํฅ์ ํํฐ๋ฅผ ์ ์ฉํ ํ, ์ฒ๋ฆฌ๋ ํ๋ ์์ ์์ถ๋์ด ๋ณด๊ด์ ์ํด ์ค์ ์๋ฒ์ ์
๋ก๋๋์ด์ผ ํฉ๋๋ค. VideoEncoder๋ ์ด๋ฌํ ํฅ์๋ VideoFrame์ ๋ฐ์ ์
๋ก๋๋ฅผ ์ํ ํจ์จ์ ์ด๊ณ ์์ถ๋ ์ฒญํฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
4. ์ถ๋ ฅ ๋ฐ ์๋น: ํ์ ๋๋ ์ ์ก
๋ง์ง๋ง ๋จ๊ณ๋ ์ฒ๋ฆฌ๋ ๋น๋์ค ๋ฐ์ดํฐ๋ก ๋ฌด์์ ํ ๊ฒ์ธ์ง์ ๊ดํ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ํ๋ฉด์ ํ์: ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค. ๋์ฝ๋ฉ๋๊ฑฐ๋ ์ฒ๋ฆฌ๋
VideoFrame์ ๋น๋์ค ์์, ์บ๋ฒ์ค ๋๋ WebGL ํ ์ค์ฒ์ ์ง์ ๋ ๋๋ง๋ ์ ์์ต๋๋ค. - WebRTC๋ฅผ ํตํ ์ ์ก: ์ค์๊ฐ ํต์ ์ ์ํด ์ฒ๋ฆฌ๋ ํ๋ ์์ WebRTC๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํผ์ด์๊ฒ ์ ์ก๋ ์ ์์ต๋๋ค.
- ์ ์ฅ ๋๋ ๋ค์ด๋ก๋: ์ธ์ฝ๋ฉ๋ ์ฒญํฌ๋ฅผ ์์งํ์ฌ ๋น๋์ค ํ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
- ์ถ๊ฐ ์ฒ๋ฆฌ: ์ถ๋ ฅ์ด ๋ค๋ฅธ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ก ๊ณต๊ธ๋์ด ์ผ๋ จ์ ์์ ์ ์์ฑํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๊ฐ๋ ๋ฐ ๊ณ ๋ ค ์ฌํญ
๋ค์ํ VideoFrame ํํ ์์
VideoFrame ๊ฐ์ฒด๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ๋ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํต์ฌ์
๋๋ค:
- ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ก๋ถํฐ: ๋
ผ์ํ ๋ฐ์ ๊ฐ์ด,
VideoDecoder๋VideoFrame์ ์ถ๋ ฅํฉ๋๋ค. - Canvas๋ก๋ถํฐ:
new VideoFrame(canvas, { timestamp: ... })๋ฅผ ์ฌ์ฉํ์ฌ HTML Canvas ์์์์ ์ง์ VideoFrame์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ฒ๋ฆฌ๋ ํ๋ ์์ ์บ๋ฒ์ค์ ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ธ์ฝ๋ฉ์ด๋ ๋ค๋ฅธ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ฅผ ์ํด ๋ค์VideoFrame์ผ๋ก ์ทจ๊ธํ๋ ค ํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. - ๋ค๋ฅธ VideoFrame์ผ๋ก๋ถํฐ: ๊ธฐ์กด์ ๊ฒ์ ๋ณต์ฌํ๊ฑฐ๋ ์์ ํ์ฌ ์๋ก์ด
VideoFrame์ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ข ์ข ํ๋ ์ ์๋ ๋ณํ์ด๋ ํน์ ์กฐ์ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค. - OffscreenCanvas๋ก๋ถํฐ: Canvas์ ์ ์ฌํ์ง๋ง ๋ฉ์ธ ์ค๋ ๋ ์ธ๋ถ ๋ ๋๋ง์ ์ ์ฉํฉ๋๋ค.
ํ๋ ์ ํ์์คํฌํ ๋ฐ ๋๊ธฐํ ๊ด๋ฆฌ
์ ํํ ํ์์คํฌํ๋ ๋ถ๋๋ฌ์ด ์ฌ์๊ณผ ๋๊ธฐํ์ ๋งค์ฐ ์ค์ํ๋ฉฐ, ํนํ ์ฌ๋ฌ ๋น๋์ค ์คํธ๋ฆผ์ด๋ ์ค๋์ค๋ฅผ ๋ค๋ฃจ๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ทธ๋ ์ต๋๋ค. VideoFrame์ ํ์์คํฌํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ฝ๋ฉ ์ค์ ์ค์ ๋ฉ๋๋ค. Canvas์์ VideoFrame์ ์์ฑํ ๋๋ ์ด๋ฌํ ํ์์คํฌํ๋ฅผ ์ง์ ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, ์ข
์ข
์๋ณธ ํ๋ ์์ ํ์์คํฌํ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ๊ฒฝ๊ณผ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๋ก์ด ํ์์คํฌํ๋ฅผ ์์ฑํฉ๋๋ค.
๊ธ๋ก๋ฒ ์๊ฐ ๋๊ธฐํ: ๊ธ๋ก๋ฒ ๋งฅ๋ฝ์์, ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ํด๋ญ ๋๋ฆฌํํธ๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ์์ค์ ๋น๋์ค ํ๋ ์์ด ๋๊ธฐํ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ๋ณต์กํ ๊ณผ์ ์ ๋๋ค. WebRTC์ ๋ด์ฅ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ข ์ข ์ค์๊ฐ ํต์ ์๋๋ฆฌ์ค์ ํ์ฉ๋ฉ๋๋ค.
์ฑ๋ฅ ์ต์ ํ ์ ๋ต
๋ธ๋ผ์ฐ์ ์์ ๋น๋์ค ํ๋ ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ณ์ฐ ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ์ต์ ํ ์ ๋ต์ ๋๋ค:
- Web Worker๋ก ์ฒ๋ฆฌ ์คํ๋ก๋: ๋ฌด๊ฑฐ์ด ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ ์ปดํจํฐ ๋น์ ์์ ์ ๋ฉ์ธ UI ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก Web Worker๋ก ์ฎ๊ฒจ์ผ ํฉ๋๋ค. ์ด๋ ์ํํ ์ํธ์์ฉ์ ๊ธฐ๋ํ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๋ฐ์์ฑ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
- GPU ๊ฐ์์ ์ํด WebGL ํ์ฉ: ์๊ฐ ํจ๊ณผ, ํํฐ ๋ฐ ๋ณต์กํ ๋ ๋๋ง์ ์ํด WebGL์ GPU๋ฅผ ํ์ฉํ์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค.
- ํจ์จ์ ์ธ Canvas ์ฌ์ฉ: Canvas์์ ๋ถํ์ํ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ๋ฐ ํฝ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์ ์ต์ํํฉ๋๋ค.
- ์ ์ ํ ์ฝ๋ฑ ์ ํ: ๋์ ํ๋ซํผ์ ๋ํด ์์ถ ํจ์จ์ฑ๊ณผ ๋์ฝ๋ฉ/์ธ์ฝ๋ฉ ์ฑ๋ฅ ์ฌ์ด์ ์ข์ ๊ท ํ์ ์ ๊ณตํ๋ ์ฝ๋ฑ์ ์ ํํฉ๋๋ค. AV1์ ๊ฐ๋ ฅํ์ง๋ง VP9์ด๋ H.264๋ณด๋ค ๊ณ์ฐ ๋น์ฉ์ด ๋ ๋ง์ด ๋ค ์ ์์ต๋๋ค.
- ํ๋์จ์ด ๊ฐ์: ์ต์ ๋ธ๋ผ์ฐ์ ๋ ์ข ์ข ๋์ฝ๋ฉ ๋ฐ ์ธ์ฝ๋ฉ์ ํ๋์จ์ด ๊ฐ์์ ํ์ฉํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ฅผ ํ์ฉํ๋๋ก ์ค์ ์ ํ์ธํ์ญ์์ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ณต์๋ ฅ
์ค์ ๋ฏธ๋์ด ์คํธ๋ฆผ์ ์ค๋ฅ, ํ๋ ์ ๋๋กญ ๋ฐ ๋คํธ์ํฌ ์ค๋จ์ ์ทจ์ฝํฉ๋๋ค. ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฌํ ์ํฉ์ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋์ฝ๋ ์ค๋ฅ: ๋์ฝ๋๊ฐ ์ฒญํฌ๋ฅผ ๋์ฝ๋ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ์ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค.
- ์ธ์ฝ๋ ์ค๋ฅ: ์ธ์ฝ๋ฉ ์ค์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋คํธ์ํฌ ๋ฌธ์ : ์คํธ๋ฆฌ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ฒํผ๋ง ๋ฐ ์ฌ์ ์ก ์ ๋ต์ ๊ตฌํํฉ๋๋ค.
- ํ๋ ์ ๋๋กญ: ๊น๋ค๋ก์ด ์ค์๊ฐ ์๋๋ฆฌ์ค์์๋ ์ผ๊ด๋ ํ๋ ์ ์๋๋ฅผ ์ ์งํ๊ธฐ ์ํด ํ๋ ์์ ์ฐ์ํ๊ฒ ๋๋กญํด์ผ ํ ์๋ ์์ต๋๋ค.
์ค์ ์ ์ฉ ์ฌ๋ก ๋ฐ ๊ธ๋ก๋ฒ ์ํฅ
WebCodecs VideoFrame ํ์ดํ๋ผ์ธ์ ๊ธ๋ก๋ฒ ๋๋ฌ ๋ฒ์๋ฅผ ๊ฐ์ง ํ์ ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ด๋ฒ์ํ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค:
- ํฅ์๋ ํ์ ํ์: ๊ตญ์ ์ฐธ๊ฐ์๋ฅผ ์ํด ๋ง์ถคํ ํํฐ, ์ค์๊ฐ ๋ฐฐ๊ฒฝ ๋ถํ ์ ์ฌ์ฉํ ๊ฐ์ ๋ฐฐ๊ฒฝ ๋๋ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์ ์ํ ํ์ง ์กฐ์ ์ ๊ตฌํํฉ๋๋ค.
- ์ธํฐ๋ํฐ๋ธ ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ: ์์ฒญ์๊ฐ ๋ฐฉ์ก ์ค์ ์์ ์ ๋น๋์ค ํผ๋์ ์ค์๊ฐ ํจ๊ณผ๋ฅผ ์ ์ฉํ๊ฑฐ๋, ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ํ๋ ์คํธ๋ฆผ์ ์ธํฐ๋ํฐ๋ธ ์ค๋ฒ๋ ์ด๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค. ์์ฒญ์๊ฐ ๋น๋์ค ์ฐธ์ฌ์ ๋ง์ถค ์ด๋ชจํฐ์ฝ์ ์ถ๊ฐํ ์ ์๋ ๊ธ๋ก๋ฒ e-์คํฌ์ธ ์ด๋ฒคํธ๋ฅผ ์์ํด ๋ณด์ญ์์ค.
- ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๋น๋์ค ํธ์ง: ์ ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ ๊ตํ ๋น๋์ค ํธ์ง ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๊ฐ ๋ฌด๊ฑฐ์ด ์ํํธ์จ์ด๋ฅผ ์ค์นํ์ง ์๊ณ ๋ ์ฝํ ์ธ ๋ฅผ ์ ์ํ๊ณ ๊ณต์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ค์๊ฐ ๋น๋์ค ๋ถ์: ๋ณด์ ์นด๋ฉ๋ผ, ์ฐ์ ์ฅ๋น ๋๋ ์๋งค ํ๊ฒฝ์ ๋น๋์ค ํผ๋๋ฅผ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋ชจ๋ํฐ๋ง, ์ด์ ๊ฐ์ง ๋๋ ๊ณ ๊ฐ ํ๋ ๋ถ์์ ์ํํฉ๋๋ค. ์ ์ธ๊ณ ๋ชจ๋ ๋งค์ฅ์ ๊ณ ๊ฐ ํธ๋ํฝ ํจํด์ ๋์์ ๋ถ์ํ๋ ๊ธ๋ก๋ฒ ์๋งค ์ฒด์ธ์ ์๊ฐํด ๋ณด์ญ์์ค.
- ์ฆ๊ฐ ํ์ค(AR) ๊ฒฝํ: ๋ชจ๋ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ ์ดํ๊ณ ์ ๊ทผํ ์ ์๋, ์ค์ ๋น๋์ค ํผ๋์ ๋์งํธ ์ฝํ ์ธ ๋ฅผ ์ค๋ฒ๋ ์ดํ๋ ๋ชฐ์ ํ AR ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํฉ๋๋ค. ์ด๋ ๋๋ผ์ ๊ณ ๊ฐ์ด๋ ์ ๊ทผํ ์ ์๋ ์๋ฅ ๊ฐ์ ์ฐฉ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ํ์ ์ธ ์์ ๋๋ค.
- ๊ต์ก ๋๊ตฌ: ๊ฐ์ฌ๊ฐ ์ค์๊ฐ ๋น๋์ค ํผ๋์ ์ฃผ์์ ๋ฌ๊ฑฐ๋ ํ์๋ค์ด ๋์ ์๊ฐ์ ํผ๋๋ฐฑ์ผ๋ก ์ฐธ์ฌํ ์ ์๋ ์ธํฐ๋ํฐ๋ธ ํ์ต ํ๋ซํผ์ ๋ง๋ญ๋๋ค.
๊ฒฐ๋ก : ์น ๋ฏธ๋์ด์ ๋ฏธ๋๋ฅผ ์์ฉํ๋ค
WebCodecs VideoFrame ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์น ๋ฉํฐ๋ฏธ๋์ด ๊ธฐ๋ฅ์ ์ค์ํ ๋์ฝ์ ์๋ฏธํฉ๋๋ค. ๋น๋์ค ํ๋ ์์ ๋ํ ์ ์์ค ์ ๊ทผ์ ์ ๊ณตํจ์ผ๋ก์จ, ๊ฐ๋ฐ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๊ณ ๋๋ก ๋ง์ถคํ๋๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ํ์ ์ ์ธ ๋น๋์ค ๊ฒฝํ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ค์๊ฐ ํต์ , ๋น๋์ค ๋ถ์, ์ฐฝ์์ ์ธ ์ฝํ ์ธ ์ ์ ๋๋ ๋น๋์ค ์กฐ์๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๋ , ์ด ํ์ดํ๋ผ์ธ์ ์ดํดํ๋ ๊ฒ์ด ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๋ ์ด์ ์ ๋๋ค.
WebCodecs์ ๋ํ ๋ธ๋ผ์ฐ์ ์ง์์ด ๊ณ์ ์ฑ์ํ๊ณ ๊ฐ๋ฐ์ ๋๊ตฌ๊ฐ ์งํํจ์ ๋ฐ๋ผ, ์ด๋ฌํ ๊ฐ๋ ฅํ API๋ฅผ ํ์ฉํ๋ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํญ๋ฐ์ ์ธ ์ฆ๊ฐ๋ฅผ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์ง๊ธ ์ด ๊ธฐ์ ์ ์์ฉํ๋ฉด ์ต์ฒจ๋จ ๋น๋์ค ๊ธฐ๋ฅ์ผ๋ก ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ค๋น๊ฐ ๋ ์น ๋ฏธ๋์ด ๊ฐ๋ฐ์ ์ต์ ์ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฃผ์ ์์ :
- VideoFrame์ ๋์ฝ๋ฉ๋ ๋น๋์ค ๋ฐ์ดํฐ์ ์ค์ฌ ๊ฐ์ฒด์ ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ฝ๋ฉ, ์ฒ๋ฆฌ/์กฐ์, ๊ทธ๋ฆฌ๊ณ ์ ํ์ ์ผ๋ก ์ธ์ฝ๋ฉ์ ํฌํจํฉ๋๋ค.
- Canvas์ WebGL์
VideoFrame๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. - Web Worker์ GPU ๊ฐ์์ ํตํ ์ฑ๋ฅ ์ต์ ํ๋ ๊น๋ค๋ก์ด ์์ ์ ํ์์ ์ ๋๋ค.
- WebCodecs๋ ๊ณ ๊ธ์, ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ๋น๋์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ค๋ WebCodecs๋ก ์คํ์ ์์ํ๊ณ ๋ค์ ๊ธ๋ก๋ฒ ์น ํ๋ก์ ํธ๋ฅผ ์ํ ๋๋ผ์ด ๊ฐ๋ฅ์ฑ์ ๋ฐ๊ฒฌํ์ญ์์ค!